


### 函数使用

```js
// string 是参数类型
// void 是返回值类型

// ---------直接使用-----------------------------------------------

function patchUser(name: string, age:number, sex?:number): void {
  console.log(" Hello, " + name);
}

// ---------es6的剩余参数（在不确定参数个数时使用）---------------------

function getUser (...item:any[]){
    console.log(item)
}

function getUser2 (name:string, ...item:any[]){
    console.log(item)
}

getUser(1); // [1]  真数组
getUser2('张三','4'); // ['4']  真数组

// ----------使用 interface 类型-------------------------------------

interface CreateUser {
  (name: string, age: number): boolean;
}

let createUser: CreateUser = (name: string, age: number) => true;

// ---------使用 类型别名 类型-----------------------------------------

type DeleteUser = (name: string, age: number) => boolean;

let deleteUser: DeleteUser = (name: string, age: number) => true;
```

** ? ：可选参数。只能出现在末尾，可出现多个。代表这个参数可以不传。**  


## 函数重载

重载就是允许方法名称相同，但是参数类型或参数个数不同，调用时会匹配到相应的方法进行执行。

js中相同的函数名，后者会覆盖前者。


假设有一个需求，是判断传入的对象是字符串类型还是数字类型，针对不同的类型进行不同的操作并返回，可能会想到这样写：
```ts 

typeOperation('ABC')

function typeOperation(type: number | string): number | string | void {
    if (typeof type === 'number') {
        // xxxxx（省略）    number 类型相关操作方法
        return type
    } else if (typeof type === 'string') {
        // xxxxx（省略）   string 类型相关操作方法
        return type
    }
}


```
这样写的确定就是类型不明确，提示的类型是这样的 ```function typeOperation(type: number | string): number | string | void```

假如需要传入的是number类型，返回也是number类型。但返回的是string类型也不会报错。  
这种情况我们可以使用重载：

```ts 
typeOperation('ABC')

function typeOperation(type:string): string;
function typeOperation(type:number): number;
function typeOperation(type: number | string): number | string | void {
    if (typeof type === 'number') {
        // xxxxx（省略）    number 类型相关操作方法
        return type
    } else if (typeof type === 'string') {
        // xxxxx（省略）   string 类型相关操作方法
        return type
    }
}


```
前面两个不带方法体的叫做重载签名，最后一个叫做实现签名(且只能有一个)。  
提示的类型就会变成 ``` function typeOperation(type: string): string (+1 overload) ```


:::warning 注意重载函数声明的顺序：重载会从上到下寻找第一个匹配的函数
:::

像下面这种情况会优先匹配到第一个

```ts 

typeOperation('ABC') // 调用


function typeOperation(type:string, length?:number): string;
function typeOperation(type:string): string;
function typeOperation(type:number): number;
function typeOperation(type: number | string): number | string | void {
    if (typeof type === 'number') {
        // xxxxx（省略）    number 类型相关操作方法
        return type
    } else if (typeof type === 'string') {
        // xxxxx（省略）   string 类型相关操作方法
        return type
    }
}


```
